package com.cib.xagcjs.biz;

import com.alibaba.fastjson.JSONObject;
import com.cib.xagcjs.dal.EcnyUnLockMapper;
import com.cib.xagcjs.dal.MessageLogMapper;
import com.cib.xagcjs.dto.EcnyUnLockDTO;
import com.cib.xagcjs.dto.EcnyUnLockDetailDTO;
import com.cib.xagcjs.utils.CryptoUtils;
import com.cib.xagcjs.utils.ResponseUtil;
import com.cib.xagcjs.utils.TimeUtil;
import com.cib.xagcjs.vo.EcnyLockListVO;
import com.cib.xagcjs.vo.EcnyUnlockVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Description: 数币解冻通知实现层
 * Author: jingcaiqi1225@gmail.com
 * Date: 2024/2/22 14:20
 */
@Service
@Slf4j
public class EcnyUnLockService {

    @Autowired
    private ResponseUtil responseUtil;

    @Autowired
    private CryptoUtils cryptoUtils;

    @Autowired
    private EcnyUnLockMapper ecnyUnLockMapper;

    @Autowired
    private MessageLogMapper messageLogMapper;

    /**
     * 区块链发起 数币解冻通知
     * @param req 请求
     * @return 执行结果
     */
    public String encyUnLock(String req) {
        String s = cryptoUtils.decryptAndVerify(req);
        EcnyUnLockDTO data = JSONObject.parseObject(s, EcnyUnLockDTO.class);

        // 此处写推送后台业务
        // 接收的通知数据发给后台处理 (此处为模拟)

        // 获取当前通知时间
        //yyyy-MM-dd HH:mm:ss
//        data.setNotifyTime(TimeUtil.getNowTime());
        log.info("推送报文日志打印：" + s);
        log.info("data数据日志打印：" + data);

        // 接收的消息入库通知主表
        if (messageLogMapper.insertMessageLog(4,"数币解冻指令通知",TimeUtil.getNowTime(),JSONObject.toJSONString(data)) > 0) {
            log.info("数币解冻指令通知入库成功!");
            if (ecnyUnLockMapper.insertUnLock(data) > 0) {
                log.info("数币解冻记录主表入库成功!");
                List<EcnyUnLockDetailDTO> ecnyUnLockDetailDTOS = data.getAssetUnlockList();
                for (EcnyUnLockDetailDTO ecnyUnLockDetailDTO : ecnyUnLockDetailDTOS) {
                    if (ecnyUnLockMapper.insertUnLockDetail(ecnyUnLockDetailDTO, data.getTransId()) > 0) {
                        log.info("{}数币解冻记录细表入库成功!", ecnyUnLockDetailDTO);
                    } else {
                        log.info("{}数币解冻记录细表入库失败!", ecnyUnLockDetailDTO);
                    }
                }
            } else {
                log.info("数币解冻记录主表入库失败!");
            }
        } else {
            log.info("数币解冻指令通知入库失败!");
        }

        try {
            return cryptoUtils.encryptAndSign(responseUtil.getResponse(data.getTransId(), "1", ""));
        } catch (Exception e) {
            log.error("加密报文失败", e);
            throw new RuntimeException(e);
        }
    }

    public String unlockNotify(String req) {
        return null;
    }

    /**
     * 获取解冻主表解冻状态已经更改为 2 已解冻 列表
     * @param status 状态
     * @return 列表
     */
    public List<EcnyUnlockVO> selectUnLock(int status) {
        return ecnyUnLockMapper.selectUnLock(status);
    }

    /**
     * 根据这个批次的transId 获取下面所有 状态 1-成功 的列表
     * @param transId 唯一标识
     * @param status 状态
     * @return 解冻列表
     */
    public List<EcnyLockListVO> selectUnLockList(String transId, int status) {
        return ecnyUnLockMapper.selectUnLockList(transId, status);
    }

    /**
     * // 修改冻结通知表状态为 3 已反馈
     * @param transId 唯一标识
     * @param status 状态
     */
    public void updateUnLockStatus(String transId, int status) {
        ecnyUnLockMapper.updateUnLockStatus(transId, status);
    }
}
